package com.qf.filters;

import com.qf.feign.CacheService;
import com.qf.service.SendReportService;
import com.qianfeng.smsplatform.common.constants.CacheConstants;
import com.qianfeng.smsplatform.common.constants.InterfaceExceptionDict;
import com.qianfeng.smsplatform.common.model.Standard_Report;
import com.qianfeng.smsplatform.common.model.Standard_Submit;
import org.springframework.aop.scope.ScopedProxyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/*
 * @Data: 2021/7/20 8:35
 * */

/*
* 这个过滤器的主要作用是限流的
 * 限制同一个客户针对同一个号码最多能发送多少次短信
 * 比如一分钟最多发2次, 一小时5次 一天 10次
* */
//@Component
public class LimitFilter implements FiltersChain {


    private SendReportService sendReportService;
    @Autowired
    public void setSendReportService(SendReportService sendReportService) {
        this.sendReportService = sendReportService;
    }

    private CacheService cacheService;
    @Autowired
    public void setCacheService(CacheService cacheService) {
        this.cacheService = cacheService;
    }

    public boolean dealSms(Standard_Submit standard_submit){

        Boolean result=false;
//        获取当前客户针对这个号码已经发送了多少次短信 比如放到redis  如果放到redis 在进行比较
        int clientID = standard_submit.getClientID();
//        给这个手机发消息     发送的手机号
        String destMobile = standard_submit.getDestMobile();
//      当前时间
        long max = System.currentTimeMillis();
//        1分钟之前的时间
        long min=max-60000;
//        获取一分钟内 当前客户针对 这个手机号发送信息的次数
        Long count = cacheService.getSizeByScore(CacheConstants.CACHE_PREFIX_SMS_LIMIT+clientID+destMobile, min, max);
/*        if(count>=2){
            System.err.println("超过了一分钟的阈值限制");
           //返回结果,推送状态报告
           return result;
        }else {
            System.out.println("没有超过1分钟的限制  继续判断一小时和一天的");
            min=max-1000*60*60;
            cacheService.add2Zent(CacheConstants.CACHE_PREFIX_SMS_LIMIT+clientID+destMobile,min+"",max);
            if(count>=5){
                System.out.println("超过了一小时的限制");
                return result;
            }else {
                min=max-1000*60*60*24;
                count = cacheService.getSizeByScore(CacheConstants.CACHE_PREFIX_SMS_LIMIT + clientID + destMobile, min, max);
                   if(count>=10){
                       System.out.println("超过了一天的阈值");
                        result=false;
                   }else {
                    System.out.println("发送短信");
                    cacheService.add2Zent(CacheConstants.CACHE_PREFIX_SMS_LIMIT+clientID+destMobile,min+"",max);
                    result=true;
                }
            }*/
//      代表1分钟之内没有发超过2 条消息
        if(count<2){
            min = max - 1000 * 60 * 60;
            count = cacheService.getSizeByScore(CacheConstants.CACHE_PREFIX_SMS_LIMIT_DAY + clientID + destMobile, min, max);
            //          代表1 小时内发消息没有超过5 条
            if(count<5){
                min = max - 1000 * 60 * 60*24;
                count = cacheService.getSizeByScore(CacheConstants.CACHE_PREFIX_SMS_LIMIT_DAY + clientID + destMobile, min, max);
//               代表1天 之内没有超过10 条
                if(count<10){
                    cacheService.add2Zent(CacheConstants.CACHE_PREFIX_SMS_LIMIT_DAY + clientID + destMobile,min+"",max);
//                    放行
                    return true;
                }
            }
        }
        if(!result){
            //被拦截了
            //发送短信太频繁了
            Standard_Report standard_report = new Standard_Report();
            standard_report.setClientID(standard_submit.getClientID());
            standard_report.setSrcID(standard_submit.getSrcSequenceId());
            standard_report.setState(2);
            standard_report.setErrorCode(InterfaceExceptionDict.RETURN_STATUS_LIMIT_ERROR);
            standard_report.setDescription("当前手机号发送短信太过频繁");
            standard_report.setMobile(standard_submit.getDestMobile());
            standard_report.setSendCount(1);//第几次推送, 是这样的,我们告诉客户结果,中间可能因为网络等原因没推送到,我们需要重试,但是呢又不是无限制重试,我们可以设置一个阈值
            sendReportService.sendSmsReport(standard_report);
        }
        return result;
    }
}
